package com.atguigu.userservice.controller;


import com.atguigu.commonutils.JwtUtils;
import com.atguigu.commonutils.R;
import com.atguigu.commonutils.ordervo.UserOrderVo;
import com.atguigu.commonutils.userVo.CommentUserVo;
import com.atguigu.userservice.entity.RepUser;
import com.atguigu.userservice.entity.vo.UserRequestVo;
import com.atguigu.userservice.entity.vo.UserResponseVo;
import com.atguigu.userservice.service.RepUserService;
import com.atguigu.userservice.service.client.SubjectClient;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.List;

/**
 * <p>
 * 前端控制器
 * </p>
 *
 * @author ZhuangLiJiao
 * @since 2021-10-15
 */
@Api(description = "用户接口5001")
@RestController
@RequestMapping("/userservice/user")
public class RepUserAdminController {

    @Autowired
    private RepUserService userService;

    @Autowired
    private SubjectClient subjectClient;


    //5.设置商家审核状态
    @ApiOperation("设置商家审核状态")
    @GetMapping("setIsChecked/{id}/{status}")
    public R setIsChecked(@PathVariable("id") String id, @PathVariable("status") String status) {
        RepUser byId = userService.getById(id);
        byId.setIsChecked(status);
        userService.updateById(byId);
        return R.ok();
    }


    //4 商家审核
    @ApiOperation("分页查询用户")
    @PostMapping("getUserListPage1/{current}/{limit}")
    public R getUserListPage1(@PathVariable long current, @PathVariable long limit,
                             @RequestBody(required = false) UserRequestVo.UserQueryVo userQuery) {
        //创建page对象
        Page<RepUser> pageObject = new Page<>(current, limit);
        //构建条件
        LambdaQueryWrapper<RepUser> wrapper = new LambdaQueryWrapper<>();
        // 多条件组合查询
        // mybatis学过 动态sql
        String type = userQuery.getType();
        String nickname = userQuery.getNickname();
        String mobile = userQuery.getMobile();
        String beginTime = userQuery.getBeginTime();
        String endTime = userQuery.getEndTime();
        //判断条件值是否为空，如果不为空拼接条件
        if (!StringUtils.isEmpty(type)) {
            wrapper.eq(RepUser::getType, type);
//            //商户审核
            if (type.equals("2")) {
                wrapper.eq(RepUser::getIsChecked, userQuery.getIsChecked());
            }
        }
        if (!StringUtils.isEmpty(nickname)) {
            wrapper.like(RepUser::getNickname, nickname);
        }
        if (!StringUtils.isEmpty(mobile)) {
            wrapper.like(RepUser::getMobile, mobile);
        }

        if (!StringUtils.isEmpty(beginTime)) {
            wrapper.ge(RepUser::getCreateTime, beginTime);
        }
        if (!StringUtils.isEmpty(endTime)) {
            wrapper.le(RepUser::getModifiedTime, endTime);
        }

        //排序
        wrapper.orderByDesc(RepUser::getModifiedTime);

        //调用方法实现条件查询分页
        userService.page(pageObject, wrapper);

        long total = pageObject.getTotal();//总记录数
        List<RepUser> records = pageObject.getRecords(); //数据list集合

        List<UserResponseVo.RepUserResponseVo> terminal = new ArrayList<>();
        for (RepUser user : records) {

            UserResponseVo.RepUserResponseVo vo = new UserResponseVo.RepUserResponseVo();
            BeanUtils.copyProperties(user, vo);
            if (vo.getType().equals("2")) {
                vo.setSubjectName(subjectClient.getNameById(vo.getSubjectId()));
                vo.setSubjectParentName(subjectClient.getNameById(vo.getSubjectParentId()));
            }
            terminal.add(vo);
        }
        return R.ok().data("total", total).data("rows", terminal);
    }

    //4 条件查询带分页的方法
    @ApiOperation("分页查询用户")
    @PostMapping("getUserListPage/{current}/{limit}")
    public R getUserListPage(@PathVariable long current, @PathVariable long limit,
                             @RequestBody(required = false) UserRequestVo.UserQueryVo userQuery) {
        //创建page对象
        Page<RepUser> pageObject = new Page<>(current, limit);
        //构建条件
        LambdaQueryWrapper<RepUser> wrapper = new LambdaQueryWrapper<>();
        // 多条件组合查询
        // mybatis学过 动态sql
        String type = userQuery.getType();
        String nickname = userQuery.getNickname();
        String mobile = userQuery.getMobile();
        String beginTime = userQuery.getBeginTime();
        String endTime = userQuery.getEndTime();
        //判断条件值是否为空，如果不为空拼接条件
        if (!StringUtils.isEmpty(type)) {
            wrapper.eq(RepUser::getType, type);
//            //商户审核
//            if (type.equals("2")) {
//                wrapper.eq(RepUser::getIsChecked, userQuery.getIsChecked());
//            }
        }
        if (!StringUtils.isEmpty(nickname)) {
            wrapper.like(RepUser::getNickname, nickname);
        }
        if (!StringUtils.isEmpty(mobile)) {
            wrapper.like(RepUser::getMobile, mobile);
        }

        if (!StringUtils.isEmpty(beginTime)) {
            wrapper.ge(RepUser::getCreateTime, beginTime);
        }
        if (!StringUtils.isEmpty(endTime)) {
            wrapper.le(RepUser::getModifiedTime, endTime);
        }

        //排序
        wrapper.orderByDesc(RepUser::getModifiedTime);

        //调用方法实现条件查询分页
        userService.page(pageObject, wrapper);

        long total = pageObject.getTotal();//总记录数
        List<RepUser> records = pageObject.getRecords(); //数据list集合

        List<UserResponseVo.RepUserResponseVo> terminal = new ArrayList<>();
        for (RepUser user : records) {

            UserResponseVo.RepUserResponseVo vo = new UserResponseVo.RepUserResponseVo();
            BeanUtils.copyProperties(user, vo);
            if (vo.getType().equals("2")) {
                vo.setSubjectName(subjectClient.getNameById(vo.getSubjectId()));
                vo.setSubjectParentName(subjectClient.getNameById(vo.getSubjectParentId()));
            }
            terminal.add(vo);
        }
        return R.ok().data("total", total).data("rows", terminal);
    }

    //    //9.通过id获取用户信息
//    @ApiOperation("通过id获取用户信息")
//    @GetMapping("getCommentUserById/{userId}")
//    public CommentUserVo getCommentUserById(@PathVariable("userId") String userId) {
//        CommentUserVo commentUserVo = new CommentUserVo();
//        RepUser byId = userService.getById(userId);
//        BeanUtils.copyProperties(byId, commentUserVo);
//        return commentUserVo;
//    }
//
//    //8.根据id获取用户信息
//    @ApiOperation("根据id获取用户信息手机号码")
//    @GetMapping("getRepUserMobileById/{id}")
//    public String getRepUserMobileById(@PathVariable("id") String id) {
//        RepUser member = userService.getById(id);
//        return member.getMobile();
//    }
//
//    //8.根据id获取用户信息
//    @ApiOperation("根据id获取用户信息")
//    @GetMapping("getRepUserDetailById/{id}")
//    public R getRepUserDetailById(@PathVariable("id") String id) {
//        RepUser member = userService.getById(id);
//        return R.ok().data("getRepUserDetailById", member);
//    }
//
//    //7.根据用户id获取用户信息
//    @ApiOperation("根据用户信息获取用户id")
//    @GetMapping("/getUserInfoById/{id}")
//    public UserOrderVo getUserInfoById(@PathVariable("id") String id) {
//        RepUser user = userService.getById(id);
//        UserOrderVo vo = new UserOrderVo();
//        BeanUtils.copyProperties(user, vo);
//        return vo;
//    }
//
//
//    //6.登录，通过token获取用户信息
//    @ApiOperation("通过token获取用户信息")
//    @GetMapping("getMemberInfo")
//    //从路径中获取 token信息
//    // token是存放在请求头里面
//    public R getMemberInfo(HttpServletRequest request) {
//        //调用jwt工具类的方法。根据request对象获取头信息，返回用户id
//        String memberId = JwtUtils.getMemberIdByJwtToken(request);
//        //查询数据库根据用户id获取用户信息
//        RepUser repUser = userService.getById(memberId);
//        return R.ok().data("userInfo", repUser);
//    }
//
    //5.删除用户
    @ApiOperation("删除用户")
    @DeleteMapping("deleteUserById/{id}")
    public R mobileExit(@PathVariable("id") String id) {
        userService.removeById(id);
        return R.ok();
    }

    //53.修改用户信息
    @ApiOperation("禁用")
    @GetMapping("setUserIsDisabled/{id}/{status}")
    public R modify(@PathVariable("id") String id, @PathVariable("status") Boolean status) {

        RepUser byId = userService.getById(id);
        byId.setIsDisabled(status);
        boolean b = userService.updateById(byId);
        if (b) {
            return R.ok();
        } else {
            return R.error();
        }
    }
//
//
//    //4.修改其他信息
//    @ApiOperation("修改其他信息")
//    @PostMapping("modifyOtherMessage")
//    public R modifyOtherMessage(@RequestBody UserRequestVo.ModifyOtherMessageVo modifyPasswordVo) {
//
//        return R.ok();
//    }
//
//
//    //3.修改密码
//    @ApiOperation("修改密码")
//    @PostMapping("modifyPassword")
//    public R modifyPassword(@RequestBody UserRequestVo.ModifyPasswordVo modifyPasswordVo) {
//        //member对象封装手机号和密码
//        //调用service方法实现登录
//        //返回token值，使用jwt生成
//        boolean b = userService.modifyPassword(modifyPasswordVo);
//        if (b) {
//            return R.ok();
//        } else {
//            return R.error();
//        }
//    }
//
//
//    //2.登录
//    @ApiOperation("用户登录")
//    @PostMapping("login")
//    public R loginUser(@RequestBody UserRequestVo.LoginVo loginVo) {
//        //member对象封装手机号和密码
//        //调用service方法实现登录
//        //返回token值，使用jwt生成
//        String token = userService.login(loginVo);
//        return R.ok().data("token", token);
//    }
//
//
//    //1.注册
//    @ApiOperation("普通用户/商家用户注册")
//    @PostMapping("register")
//    public R registerUser(@RequestBody UserRequestVo.RegisterVo registerVo) {
//        userService.register(registerVo);
//        return R.ok();
//    }

}

